# 录入学生的信息: 学号, 姓名, 年份, 性别, 班级,[{},{},{}...]

from test21del_space_key import del_space_key
import datetime


def is_exist_name(xsh, name, yizh='姓名'):  # 判断是否存在此人
    for d in xsh:
        if d[yizh] == name:
            return True
    return False


def count_gender(stus):  # 计算nan/nv人数
    nan = 0
    nv = 0
    for d in stus:
        for k, v in d.items():
            if k == '性别' and v == '男':
                nan += 1
            elif k == '性别' and v == '女':
                nv += 1
    print('男生有:', nan, '人,女生有:', nv, '人')


def insert(stus):
    sf = True
    while sf:
        nsf = True
        while nsf:
            print('输入学生信息:')
            while True:
                xm = del_space_key(input('请输入学生姓名:'))
                yxm = is_exist_name(stus, xm)
                if yxm:
                    print('提示:发现重名')
                    chxi = input('是(0)否(1)重新输入?')
                    if chxi == '1' or chxi == '否':
                        break
                else:
                    break
            while True:
                nl = input('请输入学生出生年份:')
                if nl.isdigit():
                    nl = int(nl)
                    break
                else:
                    print('请输入数字,')
            xb = del_space_key(input('请输入学生性别:'))
            bj = del_space_key(input('请输入学生班级:'))
            xh = input('请输入学生学号:')
            while True:
                if xh.isdigit():
                    xh = int(xh)
                    chfu = is_exist_name(stus, int(xh), '学号')
                    if chfu:
                        print('学号重复,请重新输入')
                        xh = input('请输入学生学号:')
                    else:
                        break
                else:
                    print('请输入数字,')
                    xh = input('请输入学生学号:')
            if xm == '' or xb == '' or bj == '':
                print('请不要输入空字符串')
            else:
                nsf = False
        shzd = {'姓名': xm,
                '年份': nl,
                '性别': xb,
                '班级': bj,
                '学号': xh}
        stus.append(shzd)
        yn = input('保存成功, 是否继续(yes/no):')
        if yn == 'no':
            sf = False
    print(shzd)
    write_list_in_file(stus)


def menu():
    print('''
        学生信息管理系统
    功能:
        1. 录入学生的信息: 学号, 姓名, 年份, 班级
        2. 查看所有学生信息
        3. 根据姓名查询学生信息
        9. 版本说明
        0. 退出系统
    ''')


def get(stus):
    for d in stus:
        for k, v in d.items():
            jnian = datetime.date.today().year
            print(k, ':', v, end=', ')
            if k == '年份':
                nili = jnian - v
                print('年龄:', nili, end=', ')
        print()
    print('一共有', len(stus), '名学生')
    count_gender(stus)
    px = input('要(0)不要(1)排序?')
    if px == '要' or px == '0':
        trfa = input('升序(0)还是降序(1)?')
        tkey = input('按照什么排序?(年份/学号)')
        sort_year_class(stus, trfa, tkey)
        input('按回车返回')


def update(stus, i):
    '''
    :param: stus 学生列表
    :i: 需要修改的索引
    '''
    print('你要修改的是:', stus[i])
    while True:
        xm = del_space_key(input('请输入学生姓名:'))
        if xm == '':
            xm = stus[i]['姓名']
            break
        yxm = is_exist_name(stus, xm)
        if yxm:
            print('提示:发现重名')
            chxi = input('是(0)否(1)重新输入?')
            if chxi == '1' or chxi == '否':
                break
        else:
            break
    nl = input('请输入学生出生年份:')
    if nl == '':
        nl = stus[i]['年份']
    else:
        while True:
            if nl.isdigit():
                nl = int(nl)
                break
            else:
                print('请输入数字,')
                nl = input('请输入学生出生年份:')
    xb = input('请输入学生性别:')
    if xb == '':
        xb = stus[i]['性别']
    bj = input('请输入学生班级:')
    if bj == '':
        bj = stus[i]['班级']
    xh = input('请输入学生学号:')
    if xh == '':
        xh = stus[i]['学号']
    else:
        while True:
            yizh = '学号'
            chfu = is_exist_name(stus, int(xh), yizh)
            # print('chufu:',chfu)
            if chfu:
                print('学号重复,请重新输入')
                xh = input('请输入学生学号:')
            elif xh.isdigit():
                xh = int(xh)
                break
            else:
                print('请输入数字,')
                xh = input('请输入学生学号:')
    stus[i] = {'姓名': xm,
               '年份': int(nl),
               '性别': xb,
               '班级': bj,
               '学号': int(xh)}
    print('修改成功!修改后:', stus[i])
    write_list_in_file(stus)


def delete(stus, i):
    print('你要删除的是:', stus[i])
    sc = input('确定要删除吗?请输入:(yes/no)')
    if sc == 'yes':
        stus.remove(stus[i])
        print('删除成功!')
    write_list_in_file(stus)


def search(xm, stus, yizh='姓名'):
    found = False
    l = []
    for i, d in enumerate(stus):
        if str(xm) in str(d[yizh]):
            print(d)
            found = True
            l.append(d)
    for i, d in enumerate(l):
        if len(l) >= 2:
            print('这是第', i + 1, '个,一共有', len(l), '个')
        xz = input('请选择:1,修改,2,删除,3,返回')
        if xz == '1':
            j = stus.index(d)
            update(stus, j)
        elif xz == '2':
            j = stus.index(d)
            delete(stus, j)
    if not found:
        print('没有找到', xm)


def version():
    print('''
    版本说明:
        V1.0: 2021-8-10 - 实现了基本的增删改查
        V2.0: 2021-8-11 - 对于无效输入(空字符串,空格,类型错误)进行判断提示
                        - 修改时只需要输入需要修改的内容,不需要修改的直接按回车跳过
                        - 显示用户实际年龄
                        - 排序: 按年龄/学号以及升序/降序排序  
                        - 统计: 总人数,男/女生人数 
                        - 可以按照班级等其他内容查询,支持多结果查询 
        V3.0: 2021-8-12 - 新增和修改姓名时判断是否有重名, 有重名的话要进行提示,是否继续
                        - 支持按照学号,班级查询      
                        - 实现模糊查询
                        - 学号不能重复
        需要完善的功能:
            * 
    ''')
    input('按回车返回')


def write_list_in_file(content, filename='stus.txt', type='w'):
    '''
    向文件写入列表,默认是覆盖写入
    content: 要写入的列表
    filename: 文件名
    type: 写入方式 'w'覆盖 'a'追加
    '''
    with open(filename, type, encoding='utf-8') as f:
        for item in content:
            f.writelines(str(item))
            f.writelines('\n')


def read_list_from_file(filename='stus.txt', type='r'):
    l = []
    for line in open(filename, encoding='utf-8'):
        l.append(dict(eval(line)))
    return l


def sort_year_class(stus, trfa='0', tkey='年份'):
    '''
    排序
    trfa: 指定升序还是降序
    tkey: 指定要排序的字段名 
    '''
    nstus = stus.copy()
    if trfa == '0' or trfa == '升序':
        nstus.sort(key=lambda x: x[tkey])
    else:
        nstus.sort(key=lambda x: x[tkey], reverse=True)
    for d in nstus:
        for k, v in d.items():
            jnian = datetime.date.today().year
            print(k, ':', v, end=', ')
            if k == '年份':
                nili = jnian - v
                print('年龄:', nili, end=', ')
        print()
    print('一共有', len(nstus), '名学生')
